
package com.github.mikephil.charting.components;

import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;

import com.github.mikephil.charting.utils.Utils;

/**
 * The limit line is an additional feature for all Line-, Bar- and
 * ScatterCharts. It allows the displaying of an additional line in the chart
 * that marks a certain maximum / limit on the specified axis (x- or y-axis).
 *
 * @author Philipp Jahoda
 */
public class LimitLine extends ComponentBase {
    
    /**
     * limit / maximum (the y-value or xIndex)
     */
    private float mLimit = 0f;
    
    /**
     * the width of the limit line
     */
    private float mLineWidth = 2f;
    
    /**
     * the color of the limit line
     */
    private int mLineColor = Color.rgb(237, 91, 91);
    
    /**
     * the style of the label text
     */
    private Paint.Style mTextStyle = Paint.Style.FILL_AND_STROKE;
    
    /**
     * label string that is drawn next to the limit line
     */
    private String mLabel = "";
    
    /**
     * the path effect of this LimitLine that makes dashed lines possible
     */
    private DashPathEffect mDashPathEffect = null;
    
    /**
     * indicates the position of the LimitLine label
     */
    private LimitLabelPosition mLabelPosition = LimitLabelPosition.RIGHT_TOP;
    
    /**
     * enum that indicates the position of the LimitLine label
     */
    public enum LimitLabelPosition {
        LEFT_TOP, LEFT_BOTTOM, RIGHT_TOP, RIGHT_BOTTOM
    }
    
    /**
     * Constructor with limit.
     *
     * @param limit - the position (the value) on the y-axis (y-value) or x-axis
     *              (xIndex) where this line should appear
     */
    public LimitLine(float limit) {
        mLimit = limit;
    }
    
    /**
     * Constructor with limit and label.
     *
     * @param limit - the position (the value) on the y-axis (y-value) or x-axis
     *              (xIndex) where this line should appear
     * @param label - provide "" if no label is required
     */
    public LimitLine(float limit, String label) {
        mLimit = limit;
        mLabel = label;
    }
    
    /**
     * Returns the limit that is set for this line.
     */
    public float getLimit() {
        return mLimit;
    }
    
    /**
     * set the line width of the chart (min = 0.2f, max = 12f); default 2f NOTE:
     * thinner line == better performance, thicker line == worse performance
     * 推荐使用 {@link #setLineWidthInPx(float)}
     */
    @Deprecated
    public void setLineWidth(float width) {
        
        if (width < 0.2f)
            width = 0.2f;
        if (width > 12.0f)
            width = 12.0f;
        mLineWidth = Utils.convertDpToPixel(width);
    }
    
    /**
     * 设置线宽, 单位px
     *
     * @param width px
     */
    public void setLineWidthInPx(float width) {
        if (width < 1) {
            width = 1;
        }
        
        mLineWidth = width;
    }
    
    /**
     * returns the width of limit line
     */
    public float getLineWidth() {
        return mLineWidth;
    }
    
    /**
     * Sets the linecolor for this LimitLine. Make sure to use
     * getResources().getColor(...)
     */
    public void setLineColor(int color) {
        mLineColor = color;
    }
    
    /**
     * Returns the color that is used for this LimitLine
     */
    public int getLineColor() {
        return mLineColor;
    }
    
    /**
     * Enables the line to be drawn in dashed mode, e.g. like this "- - - - - -"
     *
     * @param lineLength  the length of the line pieces
     * @param spaceLength the length of space inbetween the pieces
     * @param phase       offset, in degrees (normally, use 0)
     */
    public void enableDashedLine(float lineLength, float spaceLength, float phase) {
        mDashPathEffect = new DashPathEffect(new float[]{
            lineLength, spaceLength
        }, phase);
    }
    
    /**
     * Disables the line to be drawn in dashed mode.
     */
    public void disableDashedLine() {
        mDashPathEffect = null;
    }
    
    /**
     * Returns true if the dashed-line effect is enabled, false if not. Default:
     * disabled
     */
    public boolean isDashedLineEnabled() {
        return mDashPathEffect == null ? false : true;
    }
    
    /**
     * returns the DashPathEffect that is set for this LimitLine
     */
    public DashPathEffect getDashPathEffect() {
        return mDashPathEffect;
    }
    
    /**
     * Sets the color of the value-text that is drawn next to the LimitLine.
     * Default: Paint.Style.FILL_AND_STROKE
     */
    public void setTextStyle(Paint.Style style) {
        this.mTextStyle = style;
    }
    
    /**
     * Returns the color of the value-text that is drawn next to the LimitLine.
     */
    public Paint.Style getTextStyle() {
        return mTextStyle;
    }
    
    /**
     * Sets the position of the LimitLine value label (either on the right or on
     * the left edge of the chart). Not supported for RadarChart.
     */
    public void setLabelPosition(LimitLabelPosition pos) {
        mLabelPosition = pos;
    }
    
    /**
     * Returns the position of the LimitLine label (value).
     */
    public LimitLabelPosition getLabelPosition() {
        return mLabelPosition;
    }
    
    /**
     * Sets the label that is drawn next to the limit line. Provide "" if no
     * label is required.
     */
    public void setLabel(String label) {
        mLabel = label;
    }
    
    public void setLimit(float limit) {
        mLimit = limit;
    }
    
    /**
     * Returns the label that is drawn next to the limit line.
     */
    public String getLabel() {
        return mLabel;
    }
}
